/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fait.ferm.persists;

import fait.ferm.global.Glob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Описывает сущность "Пользователь системы".
 * Имеет имя и пароль
 * @author alex
 */
public final class Users extends PersistsObject{
	/**
	 *
	 */
	public String name="";
	/**
	 *
	 */
	public String password="";

	/**
	 *
	 * Конструктор без параметров
	 */
	public Users(){
		super();
	}
	
	/**
	 * Создает объект по id из БД
	 * @param pid
	 * @throws Exception
	 */
	public Users(int pid) throws Exception {
		super(pid);
		load();
	}
	/**
	 *
	 * @param pid - id пользователя
	 * @param pn - имя пользователя
	 * @param pp - пароль пользователя
	 */
	public Users( int pid, String pn, String pp) {
		super(pid);
		name = pn;
		password = pp;
	}
	
	/**
	 * Загрузка из БД
	 * @throws Exception
	 */
	@Override
	public void load() throws Exception {
		boolean notSuccessfully=true;
		try (Statement st = con.createStatement()) {
			String q = "SELECT name, password FROM users WHERE id = " + id;
			ResultSet rs = st.executeQuery(q);
			if(rs.next()){
				notSuccessfully=false;
				name = rs.getString("name");
				password = rs.getString("password");
			}
			rs.close();
		}
		if(notSuccessfully) {
			throw new Exception("Пользователь не загружен");
		}	
	}

	/**
	 * Обновление в БД
	 * @throws SQLException
	 */
	@Override
	protected void update() throws SQLException {
		try (Statement st = con.createStatement()) {
			String q = "UPDATE users SET name='"+name+"', password='"+password+"' "+
					"WHERE id="+id;
			st.executeUpdate(q);
		}
	}

	/**
	 * Создание нового 
	 * @throws SQLException
	 */
	@Override
	protected void createNew() throws SQLException {
		try (Statement st = con.createStatement()) {
			String q = "INSERT INTO users ( name, password) VALUES('"+name+"','"+password+"') ";
			st.executeUpdate(q);
			q="SELECT seq FROM sqlite_sequence WHERE name = 'users'";
			ResultSet rs = st.executeQuery(q);
			if(rs.next()){
				id = rs.getInt("seq");
			}
			rs.close();
		}
	}
	
	/**
	 * Приведение к типу String
	 * @return 
	 */
	@Override
	public String toString(){
		return name;
	}
	
	/**
	 * Статический метод для загрузки пользователя по имени и паролю (без id)
	 * @param pn - имя пользователя
	 * @param pp - пароль
	 * @return Возвращает объект типа Users
	 */
	public static Users getUserByName(String pn, String pp){
		Connection con = Glob.getConnection();
		Users res = null;
		Statement st = null;
		ResultSet rs = null;
		try {
			st = con.createStatement();
			String q = "SELECT id, name, password FROM users WHERE name = '" + pn + "' AND password = '" + pp +"'";
			rs = st.executeQuery(q);
			if(rs.next()){
				res = new Users(rs.getInt("id"), rs.getString("name"),rs.getString("password"));
			}
		}
		catch (SQLException ex) {
			Logger.getLogger(Users.class.getName()).log(Level.SEVERE, null, ex);
		}		
		finally {
			try {
				rs.close();
				st.close();
			} catch (SQLException ex) {
				Logger.getLogger(Users.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
		return res;
	}
	/**
	 * Статический метод, который возвращает строковое описание объекта, без загрузки всех его параметров
	 * @param id - идентификатор объекта
	 * @return Возвращает строку-описание объекта, если такой объект есть в БД или пустую строку в противном случае.
	 */
	public static String getName(int id){
		Connection con = Glob.getConnection();
		ResultSet rs = null;
		boolean notSuccessfully=true;
		String name = "";
		if(id==-1) {
			return "";
		}	
		try (Statement st = con.createStatement()) {
			String q = "SELECT name FROM users WHERE id = " + id;
			rs = st.executeQuery(q);
			if(rs.next()){
				notSuccessfully=false;
				name = rs.getString("name");
			}
		}
		catch (SQLException ex) {
			Logger.getLogger(Ferm.class.getName()).log(Level.SEVERE, null, ex);
		}finally{
			try {			
				rs.close();
			} catch (SQLException ex) {
				Logger.getLogger(Ferm.class.getName()).log(Level.SEVERE, null, ex);
			}
		}		
		return name;
	}
	
}
